import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.regex.Pattern;

public class RegistrationFrame extends JFrame {
    private JTextField usernameField;  // 用户名输入框
    private JPasswordField passwordField;  // 密码输入框
    private JTextField emailField;  // 邮箱输入框

    // 构造方法，设置界面基本属性
    public RegistrationFrame() {
        setLocationRelativeTo(null);  // 将界面居中显示
        setTitle("客户注册");  // 设置界面窗口标题
        setSize(780, 450);  // 设置界面大小，增加高度以容纳邮箱字段
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  // 设置关闭操作，隐藏当前窗口并释放其它资源

        JPanel panel = new JPanel();  // 创建面板，默认FlowLayout布局
        panel.setLayout(new GridLayout(4, 2, 10, 10)); // 使用GridLayout以便对齐输入框和标签
        add(panel);  // 将面板添加到界面

        JLabel userLabel = new JLabel("用户名(长度不少于5个字符):");  // 创建标签
        panel.add(userLabel);  // 将标签添加到面板

        usernameField = new JTextField(20);  // 创建用户名输入框
        panel.add(usernameField);  // 将用户名输入框添加到面板

        JLabel passwordLabel = new JLabel("密码(长度大于8个字符，必须是大小写字母、数字和标点符号的组合):");  // 创建密码标签
        panel.add(passwordLabel);  // 将密码标签添加到面板

        passwordField = new JPasswordField(20);  // 创建密码输入框
        panel.add(passwordField);  // 将密码输入框添加到面板

        JLabel emailLabel = new JLabel("邮箱:");  // 创建邮箱标签
        panel.add(emailLabel);  // 将邮箱标签添加到面板

        emailField = new JTextField(20);  // 创建邮箱输入框
        panel.add(emailField);  // 将邮箱输入框添加到面板

        JButton registerButton = new JButton("注册");  // 创建注册按钮
        panel.add(registerButton);  // 将注册按钮添加到面板

        JButton backButton = new JButton("返回");  // 创建返回按钮
        panel.add(backButton);  // 将返回按钮添加到面板

        // 注册按钮的事件监听器
        registerButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String username = usernameField.getText();  // 获取用户名输入框中的文本
                String password = new String(passwordField.getPassword());  // 获取密码输入框中的文本
                String email = emailField.getText();  // 获取邮箱输入框中的文本

                // 验证用户名、密码和邮箱
                if (validateUsername(username) && validatePassword(password) && validateEmail(email)) {
                    // 调用注册用户方法，并根据返回结果显示相应的消息对话框
                    if (registerUser(username, password, email)) {
                        JOptionPane.showMessageDialog(RegistrationFrame.this, "注册成功！", "注册成功", JOptionPane.INFORMATION_MESSAGE);
                        dispose(); // 关闭整个注册界面
                        LoginFrame loginFrame = new LoginFrame();
                        loginFrame.setVisible(true);
                    } else {
                        JOptionPane.showMessageDialog(RegistrationFrame.this, "注册失败，请重试。", "注册失败", JOptionPane.ERROR_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(RegistrationFrame.this, "用户名、密码或邮箱无效，请检查输入。", "输入无效", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        // 返回按钮的事件监听器
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 关闭注册界面，返回登录界面
                dispose();
                LoginFrame loginFrame = new LoginFrame();
                loginFrame.setVisible(true);
            }
        });
    }

    // 验证用户名是否符合要求
    private boolean validateUsername(String username) {
        return username.length() >= 5;  // 用户名长度不少于5个字符
    }

    // 验证密码是否符合要求
    private boolean validatePassword(String password) {
        if (password.length() <= 8) {
            return false;  // 密码长度必须大于8个字符
        }
        // 密码必须包含至少一个大小写字母、一个数字和一个标点符号
        String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{9,}$";
        return Pattern.matches(regex, password);
    }

    // 验证邮箱是否符合要求
    private boolean validateEmail(String email) {
        String regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
        return Pattern.matches(regex, email);  // 邮箱格式检查
    }

    // 注册用户的方法
    private boolean registerUser(String username, String password, String email) {
        Connection connection = null;
        try {
            connection = DBUtil.getConnection();  // 获取数据库连接
            String sql = "INSERT INTO customers (username, password, email) VALUES (?, ?, ?)";  // SQL插入语句
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {  // 得到预处理对象preparedStatement
                // 设置预处理语句的参数
                preparedStatement.setString(1, username);
                preparedStatement.setString(2, password);
                preparedStatement.setString(3, email);
                // 执行更新操作
                int affectedRows = preparedStatement.executeUpdate(); // 预处理调用方法
                return affectedRows > 0; // 如果有记录被插入，表示注册成功
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        } finally {
            DBUtil.closeConnection(connection);  // 关闭数据库连接
        }
    }

}
